package com.example.demo.arithmetic.algorithm.sort2024;

public class HeapSort {
    public void sort(int arr[]) {
        int n = arr.length;

        // 构建最大堆,从第一个非叶子节点开始 n/2-1
        for (int i = n / 2 - 1; i >= 0; i--) {
            heapify(arr, n, i);
        }

        // 一个一个从堆中取出元素
        for (int i = n - 1; i > 0; i--) {
            // 交换当前堆顶元素和堆的最后一个元素
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

            // 调整堆
            heapify(arr, i, 0);
        }
    }

    void heapify(int arr[], int n, int i) {
        int largest = i;
        int left = 2 * i + 1;
        int right = 2 * i + 2;

        // 如果左子节点大于根节点
        if (left < n && arr[left] > arr[largest])
            largest = left;

        // 如果右子节点大于根节点
        if (right < n && arr[right] > arr[largest])
            largest = right;

        // 如果最大值不是根节点
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;

            // 递归调整堆
            heapify(arr, n, largest);
        }
    }

    public static void main(String args[]) {
        int arr[] = {12, 11, 13, 5, 6, 7};
        HeapSort ob = new HeapSort();
        ob.sort(arr);
        System.out.println("Sorted array is");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}
